<?php
defined('_IN_CMS') or die('Fuck off');

class User extends Db
{
    use data, face, pagination, rights;
    public $reg_error; // Ошибки при регистрации
    public $link;         // Для SQL
    public $rights;      // Массив с правами
    public $ua         = 'X3'; // User-Agent
    public $os         = 'X3'; // ОС посетителя по умолчанию
    public $ref        = '';   // Реферер
    public $ref_text   = '';   // Текст ссылки на реферер
    public $ip_filter  = '';
    public $ua_filter  = '';
    public $os_filter  = '';
    public $ref_filter = '';
    public $req_filter = '';
    public  $sql;


    public function __construct()
    {
        // Массив сообщений об ошибках регистрации пользователя
        $this->reg_error[0] = '';
        // Значения по умолчанию
        $this->id = 0;
        $this->login = 'guest';
        $this->name = 'Гость';
        $this->email = 'email@mail.ru';
        $this->password = 'guest';
        $this->ip = '192.168.1.1';
        $this->ua = ''; 
        $this->answer = '0'; // Ответ на капчу

        // Переносим данные юзера из сессии в свойства объекта
        if (isset($_SESSION['authorized'])) {
            if ($_SESSION['authorized'] == true) {
                // Если он авторизован
                $this->id = (int)$_SESSION['id'];
                $this->login = $_SESSION['login'];
                $this->name = $_SESSION['name'];
                $this->email = $_SESSION['email'];
                $this->password = $_SESSION['password'];
                $this->ip = $_SESSION['ip'];
                $this->ua = $_SESSION['ua'];
                $this->answer = '0'; 
                $this->authorized = true;
                self::initRights($this);
            } else {
                // Если не авторизован
                $_SESSION['authorized'] = false;
                $this->authorized = false;
            }
        } else {
            if (isset($_SESSION)) {
                $_SESSION['authorized'] = false;
            }
            $this->authorized = false;
        }
    }

    public function __destruct()
    {
        if ($this->authorized == true) {
            if (isset($_SESSION)) {
                $_SESSION['authorized'] = true;
                $_SESSION['id'] = (int)$this->id;
                $_SESSION['login'] = $this->login;
                $_SESSION['name'] = $this->name;
                $_SESSION['email'] = $this->email;
                $_SESSION['password'] = $this->password;
                $_SESSION['ip'] = $this->ip;
                $_SESSION['ua'] = $this->ua;
                $_SESSION['answer'] = $this->answer;
            }
        } elseif ($this->authorized == false) {
            $_SESSION['authorized'] = false;
            $_SESSION['id'] = 0;
            $_SESSION['login'] = 'guest';
            $_SESSION['name'] = 'Гость';
            $_SESSION['email'] = 'xsdfdf';
            $_SESSION['password'] = 'guest';
            $_SESSION['ip'] = '192.163.34.34';
            $_SESSION['ua'] = 'Opera';
            $_SESSION['answer'] = '0';
        }
    }

    public function login()
    {
        // Авторизация пользователя
        if ($this->authorized == false) {
            // Если пользователь не авторизован
            if (isset($_POST['login']) && (isset($_POST['password']))) {
                $login = $_POST['login'];
                $password = $_POST['password'];
                
                $password = md5($password.md5(strrev($password)));
                
                if (($this->is_valid_login($login)) && ($this->is_valid_password($password))) {
                // Если приняты валидные данные
                    $results = self::db_query("SELECT * FROM `users00` 
                        WHERE `login` = '$login' AND `password` = '$password' LIMIT 1 --");
                    if (mysql_num_rows($results) == 1) {
                        // Если нашлась запись в БД
                        $_SESSION['id'] = (int)mysql_result($results, 0, 'id');
                        $_SESSION['login'] = mysql_result($results, 0, 'login');
                        $_SESSION['name'] = mysql_result($results, 0, 'name');
                        $_SESSION['email'] = mysql_result($results, 0, 'email');
                        $_SESSION['password'] = mysql_result($results, 0, 'password');
                        $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
                        $_SESSION['authorized'] = true;
                        
                        $this->id = (int)mysql_result($results, 0, 'id');
                        $this->login = mysql_result($results, 0, 'login');
                        $this->name = mysql_result($results, 0, 'name');
                        $this->email = mysql_result($results, 0, 'email');
                        $this->password = mysql_result($results, 0, 'password');
                        $this->ip = $_SERVER['REMOTE_ADDR'];
                        $this->authorized = true;

                        if (isset($_SERVER['HTTP_USER_AGENT'])) {
                            $_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];
                        } else $_SESSION['ua'] = 'Undefined browser';
                        if (!isset($_SESSION['pages_count'])) {
                            $_SESSION['pages_count'] = 1;
                        }
                        echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/auth">Добро пожаловать. 
                        Если в браузере отключено автоперенаправление, то перейди по <a href="/auth">ссылке</a>.';
                    }
                } else {
                    echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/auth">Ты шлёшь какую-то бяку. 
                    Если в браузере отключено автоперенаправление, то перейди по <a href="/auth">ссылке</a>.';
                }
            }
        } else {
            echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/auth">Ты уже авторизован. 
            Если в браузере отключено автоперенаправление, то перейди по <a href="/auth">ссылке</a>.';
        }
    }

    public function logout()
    {
        session_unset();
        session_destroy();
    }
    
    public function register()
    {
        if ((isset($_POST['login'])) && (isset($_POST['name'])) && 
        (isset($_POST['email'])) && (isset($_POST['password'])) && 
        (isset($_POST['password_repeat'])) && isset($_POST['captcha'])) {
            $login = $_POST['login'];
            $email = $_POST['email'];
            $password = $_POST['password'];
            $password_repeat = $_POST['password_repeat'];
            $name = $_POST['name'];
            $answer = (int)$_POST['captcha'];

            if (!$this->is_valid_login($login)) $this->reg_error[] = 'Логин имеет неверный формат';
            if (!$this->is_valid_email($email)) $this->reg_error[] = 'E-mail имеет неверный формат';
            if (!$this->is_valid_password($password)) $this->reg_error[] = 'Пароль имеет неверный формат';
            if (empty($login)) $this->reg_error[] = 'Ты не ввёл логин';
            if (empty($name)) $this->reg_error[] = 'Ты не ввёл имя';
            if (empty($email)) $this->reg_error[] = 'Ты не ввёл почтовый адрес';
            if (empty($password)) $this->reg_error[] = 'Ты не ввёл пароль';
            if (strlen($password) < 8) $this->reg_error[] = 'Пароль должен быть не короче 8-и символов';
            if ($password != $password_repeat) $this->reg_error[] = 'Пароли не совпадают';
            if (isset($_SESSION['answer'])) {
                if ($answer != (int)$_SESSION['answer']) $this->reg_error[] = 'Неверно введён проверочный код';
            } else {
                $this->reg_error[] = 'Включи cookies и обнови страницу';
            }

            // Вот так будет храниться пароль в БД
            $password = md5($password.md5(strrev($password))); // Кто извращенец? Я извращенец

            if (empty($this->reg_error[1])) {
                // Если ошибок в данных нет
                // Проверяем, не существует ли уже такой пользователь
                $cmp_login = self::db_query("SELECT `login`, `email` 
                FROM `users00` WHERE ((`login` = '$login') OR 
                (`email` = '$email')) LIMIT 1 --");
                if (mysql_num_rows($cmp_login) > 0) {
                    $this->reg_error[] = 'Пользователь с таким логином или электронной почтой уже зарегистрирован в матрице';
                } else {
                    self::db_query("INSERT INTO `users00` (`login`, `email`, `password`, `name`) 
                                    VALUES ('$login', '$email', '$password', '$name') --");
                    // Номер будущего пользователя
                    //$user_insert_id = self::db_query("Show TABLE STATUS LIKE 'users00'");
                    $user_insert_id = (int)mysql_insert_id();
                    $this->setRights($user_insert_id);
                    echo 'Ты успешно зарегистрирован(а)';
                }
            }
        }
    }

    public function deleteUser(&$user)
    {
        // Метод для удаления пользователей по их id
        $user_id = (int)$_GET['deleteUser'];
        if (self::can($user, 1)) {
            // Если SVI
            self::db_query("DELETE FROM `users00` WHERE `users00`.`id` = '$user_id' LIMIT 1 --");
        }
    }
    
    public function getInfo()
    {
        // Функция возвращает массив данных о пользователе по его номеру
        if (isset($_GET['name'])) {
            $name = $_GET['name'];
        } elseif (isset($_SESSION['login'])) {
            $name = $_SESSION['login'];
        } else {
            $name = 'guest';
        }
        $userdata_sql = self::db_query("SELECT * FROM `users00` WHERE `login` = '".$name."' LIMIT 1 --");
        if (mysql_num_rows($userdata_sql) > 0) { 
            // Если есть такой пользователь, то собираем все его данные в $userdata
            $userdata['id'] = (int)mysql_result($userdata_sql, 0, 'id');
            $userdata['login'] = mysql_result($userdata_sql, 0, 'login');
            $userdata['name'] = mysql_result($userdata_sql, 0, 'name');
            $userdata['email'] = mysql_result($userdata_sql, 0, 'email');
            $userdata['about'] = mysql_result($userdata_sql, 0, 'about');
            $userdata['webpage'] = mysql_result($userdata_sql, 0, 'webpage');
            $userdata['jabber'] = mysql_result($userdata_sql, 0, 'jabber');
            $userdata['skype'] = mysql_result($userdata_sql, 0, 'skype');
            $userdata['pluses'] = (int)mysql_result($userdata_sql, 0, 'pluses');
            $userdata['minuses'] = (int)mysql_result($userdata_sql, 0, 'minuses');
            $userdata['date_last_visit'] = mysql_result($userdata_sql, 0, 'date_last_visit');
            $userdata['rating'] = $userdata['pluses'] - $userdata['minuses'];
            
        } else { // Показать профиль гостя
            $userdata['id'] = 0;
            $userdata['login'] = 'guest';
            $userdata['name'] = 'Гость';
            $userdata['email'] = 'email@mail.ru';
            $userdata['about'] = 'Я гость, у меня мало прав на этом сайте.';
            $userdata['webpage'] = 'http://miha.ru';
            $userdata['pluses'] = 0;
            $userdata['minuses'] = 0;
            $userdata['rating'] = 0;
            $userdata['date_last_visit'] = 'now';
        }
        return $userdata;
    }
    
    public function setRights($id)
    {
        // Устанавливает права для конкретного пользователя при регистрации
        $user_groups = self::db_query("SELECT * FROM `users_groups` --");
        $i = 0;
        while ($this->row = mysql_fetch_assoc($user_groups)) {
            $i++;
            self::db_query("INSERT INTO `users_rights` (`user_id` ,`group_id` ) VALUES ('$id', '$i')");
        }
        mysql_free_result($user_groups);
    }

    public function showUserlist(&$user)
    {
        if ((self::can($user, 1)) || (self::can($user, 25))) {
            // Если есть права на просмотр информации о пользователях (даже скрытой)
            $stat_status = self::db_query("Show TABLE STATUS LIKE 'users00' --"); //Состояние таблицы
            $this->count = mysql_result($stat_status, 0, 'Rows'); //Количество записей
            if ($this->count < $this->to) {
                // Если количество записей меньше, чем выбранный диапазон для показа,
                // то приравниваем эти значения в меньшую сторону
                $this->to = $this->count;    
            } else {
                $this->pages = ceil($this->count/$this->pp); // Количество страниц, округление в большую сторону
            }

            if (isset($_GET['page'])) {
                // Параметр - номер страницы
                $this->cur_page = abs((int)$_GET['page']);
                $this->from = ($this->cur_page*$this->pp)-$this->pp;
                $this->to = $this->from + $this->pp;
            }
            
            $this->ip_filter  = '';
            $this->ua_filter  = '';
            $this->os_filter  = '';
            $this->ref_filter = '';
            $this->req_filter = '';
            
            
            // ЗАМЕНИТЬ НА ТЕРНАРНЫЕ УСЛОВИЯ
            if (isset($_POST['ip_filter'])) {
                // Фильтрация IP, оставляем только точки
                // Количество точек или символов не имеет значения, так как может фильтроваться(поиск по БД) и часть запроса
                if (!empty($_POST['ip_filter'])) $this->ip_filter = str_replace('[^0-9.]', '', $_POST['ip_filter']);
            }
            if (isset($_POST['ua_filter'])) {
                if (!empty($_POST['ua_filter'])) $this->ua_filter = str_replace('[^a-zA-ZА-Яа-я0-9\s]', '', $_POST['ua_filter']);
            }
            if (isset($_POST['os_filter'])) {
                if (!empty($_POST['os_filter'])) $this->os_filter = str_replace('[^a-zA-ZА-Яа-я0-9\s]', '', $_POST['os_filter']);
            }
            if (isset($_POST['ref_filter'])) {
                if (!empty($_POST['ref_filter'])) $this->ref_filter = str_replace('[^a-zA-ZА-Яа-я0-9\s]', '', $_POST['ref_filter']);
            }
            if (isset($_POST['req_filter'])) {
                if (!empty($_POST['req_filter'])) $this->req_filter = str_replace('[^a-zA-ZА-Яа-я0-9\s]', '', $_POST['req_filter']);
            }
            
            //if (isset($_POST['reset'])) {
                // Сброс фильтра
                $this->ip_filter  = '';
                $this->ua_filter  = '';
                $this->os_filter  = '';
                $this->ref_filter = '';
                $this->req_filter = '';
            //}

            
            $this->sql_ua  = " `ua`  LIKE '%$this->ua_filter%'";         // Такой
            $this->sql_os  = "AND `ua`  LIKE '%$this->os_filter%'";     // Вот
            $this->sql_ip  = "AND `ip`  LIKE '%$this->ip_filter%'";    // Ужасный
            $this->sql_ref = "AND `ref` LIKE '%$this->ref_filter%'";  // Индусский
            $this->sql_req = "AND `ref` LIKE '%$this->req_filter%'"; // Код
            
            $this->sql_ua  = "";           // Такой
            $this->sql_os  = "";          // Вот
            $this->sql_ip  = "";         // Ужасный
            $this->sql_ref = "";        // Индусский
            $this->sql_req = "";       // Код
            
            // А в этот запрос мы вставляем строки с тем, что нужно отфильтровать
            $this->query = "SELECT * FROM `users00` 
                ORDER BY `id` ASC
                LIMIT $this->from, $this->to --";
            
            if (isset($_GET['empty'])) {
                $this->emptyStatistics();
            } else {
                $this->stat = self::db_query($this->query);
                echo mysql_error();
                // Выводим номера страниц
                $this->printPagination();
                $this->pp = mysql_num_rows($this->stat);
                if ($this->cur_page >= 2) {
                    if ($this->pp <= 0) {
                        echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/users/deleted/page='.--$this->cur_page.'">';
                    }
                }
                $this->data[0]['from'] = $this->from;
                $this->data[0]['to'] = $this->to;
                $this->data[0]['pp'] = $this->pp;
                $this->data[0]['pages'] = $this->pages;
                $this->data[0]['cur_page'] = $this->cur_page;

                for ($i = 0; $i < $this->pp; $i++) {
                    $this->data[$i]['id'] = mysql_result($this->stat, $i, "id");
                    $this->data[$i]['login'] = mysql_result($this->stat, $i, "login");
                    $this->data[$i]['password'] = mysql_result($this->stat, $i, "password");
                    $this->data[$i]['name'] = mysql_result($this->stat, $i, "name");
                    $this->data[$i]['email'] = mysql_result($this->stat, $i, "email");
                    $this->data[$i]['date_last_visit'] = mysql_result($this->stat, $i, "date_last_visit");
                }
                $this->showUserlistFace($this->data);
                $this->printPagination();
            }
        } else {
            $this->errors[] = 'Ты не можешь просматривать информацию о пользователях';
            $this->printError($this->errors);
        }
    }

    public function canAuth(&$core)
    {
        // Разрешена ли авторизация на сайте
        return ($core->cms_settings['enable_auth'] == 1) ? true : false;
    }

    public function canRegister(&$core)
    {
        // Разрешена ли регистрация на сайте
        return ($core->cms_settings['enable_registrtation'] == 1) ? true : false;
    }

}

?>
